﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data.OleDb; //подключение OleDb
using Domain; //подключение проекта Domain
using System.Data; //подключение System.Data, нужна ниже в коде
using Setting;

namespace Session
{
    public class BrokerSlOrds
    {
        OleDbConnection connection; // объявление OleDbConnection
        OleDbCommand command; // объявление OleDbCommand
        string x, f, l; // объявление переменных для функции "поиск по id"
        Props prop = new Props();
        string dbpath;

        private void readSetting()
        {
            prop.ReadXml();
            dbpath = Convert.ToString(prop.Fields.dbpath);

        }

        private void ConnectTo() // функция подключения БД
        {
            readSetting();
            connection = new OleDbConnection(@" Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + dbpath + "; Persist Security Info = False;"); // объявление техналогии и пути
            command = connection.CreateCommand(); // Создает и возвращает объект OleDbCommand, связанный с объектом OleDbConnection.

        }


        public BrokerSlOrds() // функция для класса BrokerSlOrds
        {
            ConnectTo(); // вызов функции подключения
        }

        public List<Dm_Orders> FillGrid() // функция для заполнения Grid
        {
            List<Dm_Orders> ordsList = new List<Dm_Orders>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT T_Orders.id_ords, T_Orders.id_pers_sale, T_Orders.customer, T_Orders.id_type, T_Orders.vendor, T_Orders.date, T_Orders.date_contr, T_Orders.id_pers_log, T_Orders.date_set, T_Orders.date_deliv, T_Orders.provider, T_Orders.mark_goods, T_Orders.note, T_Orders.failure, T_Orders.id_stat, T_Type.type, T_Pers.F_name, T_Pers.L_name FROM T_Type INNER JOIN (T_Pers INNER JOIN T_Orders ON T_Pers.[id_pers] = T_Orders.[id_pers_log]) ON T_Type.[id_type] = T_Orders.[id_type]"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Orders ords = new Dm_Orders(); // объявление Dm_Count

                    ords.Id_ords = Convert.ToInt32(reader["id_ords"].ToString()); // чтение Id_count из БД и занисение информации в cnt.Id_count
                    ords.Id_pers_sale = Convert.ToInt32(reader["id_pers_sale"].ToString()); // чтение Id_pers_sale из БД и занисение информации в cnt.Id_pers_sale
                    ords.Customer = reader["customer"].ToString(); // чтение Customer из БД и занисение информации в cnt.Customer
                    ords.Id_type = Convert.ToInt32(reader["id_type"].ToString());
                    ords.Vendor = reader["vendor"].ToString(); // чтение Customer из БД и занисение информации в cnt.Customer
                    ords.Date = Convert.ToDateTime(reader["date"].ToString()); // чтение Customer из БД и занисение информации в cnt.Customer
                    ords.Date_contr = Convert.ToDateTime(reader["date_contr"].ToString()); // чтение Customer из БД и занисение информации в cnt.Customer 
                    ords.Id_pers_log = Convert.ToInt32(reader["id_pers_log"].ToString()); // чтение Id_type из БД и занисение информации в cnt.Id_type
                    ords.Date_set = reader["date_set"].ToString(); // чтение Date из БД и занисение информации в cnt.Date
                    ords.Date_deliv = reader["date_deliv"].ToString(); // чтение Dis_date_ready из БД и занисение информации в cnt.Dis_date_ready
                    ords.Provider = reader["provider"].ToString(); // чтение Id_count из БД и занисение информации в cnt.Id_count
                    ords.Mark_goods = reader["mark_goods"].ToString();
                    ords.Note = reader["note"].ToString();
                    ords.Faliure = reader["failure"].ToString();
                    ords.Id_stat = Convert.ToInt32(reader["id_stat"].ToString());
                    ords.Type = reader["type"].ToString();
                    ords.F_name = reader["F_name"].ToString();
                    ords.L_name = reader["L_name"].ToString();



                    ordsList.Add(ords); // добавление данных в List< >
                }

                return ordsList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public void Insert(Dm_Orders ords, Dm_Pers prsS, Dm_Pers prsL, Dm_Type tp) // функция добавления новой записи
        {
            try
            {
                command.CommandText = "INSERT INTO T_Orders ([Id_pers_sale], [customer], [id_type], [vendor], [date], [date_contr], [id_pers_log], [id_stat]) VALUES('" + prsS.Id_pers + "', '" + ords.Customer + "', '" + tp.Id_type + "', '" + ords.Vendor + "', '" + ords.Date + "', '" + ords.Date_contr + "', '" + prsL.Id_pers + "', '" + ords.Id_stat + "')"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public List<Dm_Pers> FillComboBoxPers() // функция для заполнения ComboBox из Dm_Pers
        {
            List<Dm_Pers> prsList = new List<Dm_Pers>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT * FROM t_pers Where id_dep = 1"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Pers prs = new Dm_Pers(); // объявление Dm_Pers


                    prs.Id_pers = Convert.ToInt32(reader["Id_pers"].ToString()); // чтение Id_pers из БД и занисение информации в prs.Id_pers
                    prs.F_name = reader["F_name"].ToString(); // чтение F_name из БД и занисение информации в  prs.F_name
                    prs.L_name = reader["L_name"].ToString(); // чтение L_name из БД и занисение информации в  prs.L_name


                    prsList.Add(prs); // добавление данных в List< >
                }

                return prsList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public List<Dm_Type> FillComboBoxType() // функция для заполнения ComboBox из Dm_Type
        {
            List<Dm_Type> tpList = new List<Dm_Type>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT * FROM t_type"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Type tp = new Dm_Type(); // объявление Dm_Type


                    tp.Id_type = Convert.ToInt32(reader["Id_type"].ToString()); // чтение Id_type из БД и занисение информации в tp.Id_type
                    tp.Type = reader["type"].ToString(); // чтение type из БД и занисение информации в  tp.Type

                    tpList.Add(tp); // добавление данных в List< >
                }

                return tpList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public List<Dm_Pers> FillComboBoxPersLog() // функция для заполнения ComboBox из Dm_Pers
        {
            List<Dm_Pers> prsList = new List<Dm_Pers>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT * FROM t_pers Where id_dep = 2"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Pers prs = new Dm_Pers(); // объявление Dm_Pers


                    prs.Id_pers = Convert.ToInt32(reader["Id_pers"].ToString()); // чтение Id_pers из БД и занисение информации в prs.Id_pers
                    prs.F_name = reader["F_name"].ToString(); // чтение F_name из БД и занисение информации в  prs.F_name
                    prs.L_name = reader["L_name"].ToString(); // чтение L_name из БД и занисение информации в  prs.L_name


                    prsList.Add(prs); // добавление данных в List< >
                }

                return prsList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public void Update(Dm_Orders OldOrds, Dm_Orders NewOrds, Dm_Pers prsS, Dm_Pers prsL, Dm_Type tp) // функция обновления записи по id
        {
            try
            {
                command.CommandText = "UPDATE T_Orders SET [Id_pers_sale]='" + prsS.Id_pers + "' , [Id_pers_log] ='" + prsL.Id_pers + "' , [customer] ='" + NewOrds.Customer + "' , [id_type] ='" + tp.Id_type + "' , [vendor] ='" + NewOrds.Vendor + "' , [date] ='" + NewOrds.Date + "' , [date_contr] ='" + NewOrds.Date_contr + "' WHERE [id_ords]=" + OldOrds.Id_ords; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public void Delete(Dm_Orders ords) // функция удаления записи по id
        {
            try
            {
                command.CommandText = "DELETE FROM T_Orders WHERE Id_ords=" + ords.Id_ords; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public string idxPers(int mg) // функция "поиск по id" для Pers
        {
            try
            {
                command.CommandText = "SELECT [id_pers], [F_name], [L_name] FROM [T_pers] WHERE [id_pers] =" + mg; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    f = reader["F_name"].ToString(); // чтение F_name из БД и занисение информации в f
                    l = reader["L_name"].ToString(); // чтение L_name из БД и занисение информации в l               
                }

                return x = f + " " + l; // возврат значений f и l

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public string idxType(int mg) // функция "поиск по id" для Type
        {
            try
            {
                command.CommandText = "SELECT * FROM [T_type] WHERE [id_type] =" + mg; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    f = reader["type"].ToString(); // чтение F_name из БД и занисение информации в f              
                }

                return x = f; // возврат значений f и l

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }
    }
}
